const mongoose = require('mongoose')
const {encrypt, decrypt} = require('../utils/utils')
const roles = require('../enum/roles')
const {serverURL, uploadURL} = require("../config");
const schema = new mongoose.Schema(
  {
    username: {
      required: [true, '用户名必填'],
      index: true,
      type: String,
      validate: {
        validator(val) {
          return /^(?!\d+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,12}$/.test(val)
        },
        message: '用户名必须为 数字+字母 6-12位',
      },
      //唯一
      unique: true,
    },
    password: {
      type: String,
      //不指定select查询不会返回
      select: false,
      required: [true, '密码必填'],
      validate: {
        validator(val) {
          return /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$/.test(decrypt(val))
        },
        message: "密码8-16个字符，至少1个字母，1个数字"
      }
    },
    email: {
      type: String,
      required: [true, '邮箱必填'],
      validate: {
        validator: function (val) {
          return /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(val)
        },
        message: '请输入合法邮箱地址',
      },
      unique: true,
    },
    avatar: {
      type: String, //URL,
      default: '/img/avatar.png',
    },
    nikname: {
      type: String,
      validate: {
        validator: function (val) {
          return /^[0-9a-zA-Z\u0391-\uFFE5]{1,8}$/.test(val)
        },
        message: '昵称可包含 数字/英文/汉字 1-8位',
      },
      default: '用户' + ~~(Math.random() * 99999),
    },
    signature: {
      type: String,
      default: '这个人很懒, 什么都没有写 ^_^',
    },
    //被关注数量
    follow_num: {
      type: Number,
      default: 0,
    },
    roles: {
      type: [String],
      enum: roles,
      default: ['user'],
    },
  },
  {
    timestamps: true, // 这将自动添加createdAt和updatedAt字段
  }
)
// 开启分页
/*
mongoose-paginate-v2 提供了丰富的选项来自定义分页行为，以下是一些可用的选项属性：

select: 指定返回的字段，可以是字符串或对象
。
sort: 定义排序方式，可以是字符串或对象
。
populate: 定义关联字段的填充，可以是字符串、数组或对象
。
projection: 设置查询的投影，可以是字符串或对象
。
lean: 返回纯JavaScript对象而非Mongoose文档，默认为false
。
leanWithId: 当lean为true时，是否在返回的对象中添加id字段
。
page: 当前页码，默认为1
。
limit: 每页显示的条目数量，默认为10
。
offset: 跳过的条目数量，与page配合使用
。
collation: 指定排序的本地化选项
。
customLabels: 自定义返回结果的标签
。
pagination: 是否启用分页，默认为true
。
useEstimatedCount: 是否使用估计的文档计数，默认为false
。
useCustomCountFn: 是否使用自定义函数进行计数，默认为false
。
forceCountFn: 支持地理空间查询的计数，默认为false
。
allowDiskUse: 允许MongoDB服务器为查询使用超过100MB的内存，默认为false
。
read: 确定从MongoDB的哪个节点读取数据
*/
// 定义一个虚拟字段，用于获取文章封面图的完整URL
schema.virtual("avatar_img").get(function () {
  if (this.avatar === "/img/avatar.png") {
    return serverURL + this.avatar;
  } else {
    return uploadURL + this.avatar;
  }
});
schema.set('toJSON', {getters: true, versionKey: false, virtuals: true})
const mongoosePaginate = require('mongoose-paginate-v2')
schema.plugin(mongoosePaginate)

module.exports = mongoose.model('User', schema)
